package com.example.chamberlainserver.Vo;

import com.example.chamberlainserver.Entry.MaterialCategory;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 物资分类数据传输对象
 * 用于前端展示分类树结构
 */
@Data
public class MaterialCategoryDTO {
    private Integer id;             // 分类ID
    private String name;            // 分类名称
    private Integer parentId;       // 父分类ID
    private String description;     // 分类描述
    private Integer sortOrder;      // 排序序号
    private LocalDateTime createTime; // 创建时间
    private LocalDateTime updateTime; // 更新时间
    private List<MaterialCategoryDTO> children; // 子分类列表
    
    /**
     * 默认构造函数
     */
    public MaterialCategoryDTO() {
        this.children = new ArrayList<>();
    }
    
    /**
     * 从实体类转换为DTO
     * @param category 物资分类实体
     */
    public MaterialCategoryDTO(MaterialCategory category) {
        if (category != null) {
            this.id = category.getId();
            this.name = category.getName();
            this.parentId = category.getParentId();
            this.description = category.getDescription();
            this.sortOrder = category.getSortOrder();
            this.createTime = category.getCreateTime();
            this.updateTime = category.getUpdateTime();
            this.children = new ArrayList<>();
        }
    }
    
    /**
     * 将MaterialCategory列表转换为MaterialCategoryDTO列表
     * @param categories 物资分类实体列表
     * @return DTO列表
     */
    public static List<MaterialCategoryDTO> convertToDTOList(List<MaterialCategory> categories) {
        List<MaterialCategoryDTO> dtoList = new ArrayList<>();
        if (categories != null && !categories.isEmpty()) {
            for (MaterialCategory category : categories) {
                dtoList.add(new MaterialCategoryDTO(category));
            }
        }
        return dtoList;
    }
    
    /**
     * 构建分类树
     * @param allCategories 所有分类的DTO列表
     * @return 树形结构的分类列表（只包含顶级分类，子分类在children属性中）
     */
    public static List<MaterialCategoryDTO> buildCategoryTree(List<MaterialCategoryDTO> allCategories) {
        // 创建结果列表，用于存储顶级分类
        List<MaterialCategoryDTO> result = new ArrayList<>();
        
        // 创建一个映射，用于快速查找分类
        java.util.Map<Integer, MaterialCategoryDTO> categoryMap = new java.util.HashMap<>();
        for (MaterialCategoryDTO dto : allCategories) {
            categoryMap.put(dto.getId(), dto);
        }
        
        // 构建树形结构
        for (MaterialCategoryDTO dto : allCategories) {
            // 如果是顶级分类（parentId为null），则添加到结果列表
            if (dto.getParentId() == null) {
                result.add(dto);
            } else {
                // 如果不是顶级分类，则添加到父分类的children列表中
                MaterialCategoryDTO parent = categoryMap.get(dto.getParentId());
                if (parent != null) {
                    parent.getChildren().add(dto);
                } else {
                    // 如果找不到父分类，则作为顶级分类处理
                    result.add(dto);
                }
            }
        }
        
        // 对结果列表按sortOrder排序
        result.sort((a, b) -> {
            if (a.getSortOrder() == null) return 1;
            if (b.getSortOrder() == null) return -1;
            return a.getSortOrder().compareTo(b.getSortOrder());
        });
        
        // 对每个分类的子分类列表按sortOrder排序
        for (MaterialCategoryDTO dto : allCategories) {
            if (dto.getChildren() != null && !dto.getChildren().isEmpty()) {
                dto.getChildren().sort((a, b) -> {
                    if (a.getSortOrder() == null) return 1;
                    if (b.getSortOrder() == null) return -1;
                    return a.getSortOrder().compareTo(b.getSortOrder());
                });
            }
        }
        
        return result;
    }
}